www.gusucode.com > XerCMS 携云PHP企业建站程序 v2015PHP源码程序 > XerCMS 携云PHP企业建站程序 v2015/XerCMS_v20150724/XerCMS_v20150724/XerCMS/Library/XerCMS_archive.php

    <?php
/**
 * @name     XERCMS
 * @author   Arno <XerCMS@163.com> [QQ:1328013]
 * @version  1.0.0
 * @link     http://www.XerCMS.com
 */

!defined('XERCMS') && exit('Access Denied');

include_once(dirname(__file__).'/model/XerCMS_swop.php');

class archive extends swop
{
     var $models;
     var $uid = 0;
	var $struct = array('id' => array('type'=>'int','default'=>null),
	                'column' => array('type'=>'int','default'=>0), 
	                  'area' => array('type'=>'int','default'=>0), 
	                  'lang' => array('type'=>'int','default'=>0),                      
			       'title' => array('type'=>'text','default'=>'','range'=>array(1,60)), 
			        'icon' => array('type'=>'int','default'=>null),
			       'ctime' => array('type'=>'int','default'=>0), 
			       'mtime' => array('type'=>'int','default'=>0), 
				  'image' => array('type'=>'text','default'=>'','range'=>array(1,255)), 
				   'flag' => array('type'=>'int','default'=>0), 
				   'state'=> array('type'=>'int','default'=>0));
	var $model = null;
     var $arcData = null;
	var $admin = false;
	var $error = '';
	

     function loadModel($id) {
	     $models = ini('archives/models');
		if(isset($models[$id])) {
		    $this->model = ini('archives/model/'.$models[$id]['table']);
		    return true;
		} else return false;
     }

     
	function unaudited($page = 1,$number = 30) {
          return DB::fetch_all('SELECT a.*,m.name,b.table FROM xercms_archives a 
               LEFT JOIN xercms_member m on m.uid = a.uid 
			LEFT JOIN xercms_model b on b.id = a.model 
			WHERE a.state = 0 ORDER BY a.mtime DESC LIMIT '.(($page -1)*$number).','.$number);	
	}
  
  
     function lists($page = 1,$number = 30,$column = 0,$title = null,$model = null,$state = null,$uid = 0) {
	     $where = array();
		if($column > 0) $where[] = 'a.column = \''.(int)$column.'\'';
		if(!empty($title)) $where[] = 'a.title like \'%'.$title.'%\'';	
		if(!empty($model)) $where[] = 'a.model = \''.(int)$model.'\'';	
		if(!empty($uid)) $where[] = 'a.uid = \''.(int)$uid.'\'';
		if($state !== null) $where[] = 'a.state = \''.(int)$state.'\'';	
          if(count($where) > 0) {
		   $where = ' WHERE '.implode(' AND ',$where);
		} else $where = '';	
          return DB::fetch_all('SELECT a.*,m.name,b.table,c.name as cname FROM xercms_archives a 
               LEFT JOIN xercms_member m on m.uid = a.uid 
			LEFT JOIN xercms_model b on b.id = a.model
			LEFT JOIN xercms_column c on c.id = a.column
			'.$where.' ORDER BY a.mtime DESC LIMIT '.(($page - 1)*$number).','.$number);	
	}
	
	function select($id) {
		if(empty($id)) {
               $this->arcData = $this->defaults();
			return $this->arcData;
		}
		if(isset($this->model['category']) && $this->model['category'] == 1) {
			$this->arcData = DB::result('SELECT * FROM xercms_archives a 
			LEFT JOIN xercms_data_'.$this->model['table'].' b ON b.id = a.id
			LEFT JOIN xercms_count c ON c.id = a.id 
			LEFT JOIN xercms_shop_archive s ON s.aid = a.id WHERE '.(empty($this->uid) ? '' : 'a.uid = \''.$this->uid.'\' AND ').' a.id = \''.$id.'\'');
		} else {
			$this->arcData = DB::result('SELECT * FROM xercms_archives a
			LEFT JOIN xercms_data_'.$this->model['table'].' b ON b.id = a.id
			LEFT JOIN xercms_count c ON c.id = a.id WHERE '.(empty($this->uid) ? '' : 'a.uid = \''.$this->uid.'\' AND ').' a.id = \''.$id.'\'');
		}
		if(empty($this->arcData)){
			$this->arcData = $this->defaults();
		}
		return  $this->arcData;
  	}
    
	function dedata() {
		return $this->decode($this->model['struct'],$this->arcData);
	}
  
	function defaults() {
		$data = array();
		foreach($this->model['struct'] as $k=>$v) {
			if(isset($v['name'])) {
				$data[$v['name']] = $v['type'] == 'json' ? array() : $v['default'];
	    		}
	  	}
		foreach($this->struct as $k=>$v) {
			$data[$k] = $v['default'];
		}
		return  $data;
	}


  
	function setState($ids,$val = 1) {
     	$ids = $this->safeIds($ids);
     	if(empty($ids)) {
	   		return;
		}
		if($this->admin) {DB::query('UPDATE xercms_archives SET state = '.$val.' WHERE id  in ('.$ids.')');} else {
			if(!empty($this->uid)) {
				DB::query('UPDATE xercms_archives SET state = '.$val.' WHERE id  in ('.$ids.') AND uid = '.$this->uid);
			}
		}
    
	}
  
	function safeIds($str) {
     	$str = explode(',',$str);
		foreach($str as $k=>$v) {$str[$k] = (int)$v;}
		return implode(',',$str);
  	}
  
  	function delete($ids) {
     	$ids = $this->safeIds($ids);
     	if(empty($ids)) {
			return;
		}
		//exit('SELECT a.id,m.table FROM xercms_archives a LEFT JOIN xercms_model m ON m.id = a.model WHERE a.id in ('.$ids.')');
    		$data = DB::fetch_all('SELECT a.id,m.table FROM xercms_archives a LEFT JOIN xercms_model m ON m.id = a.model WHERE a.id in ('.$ids.')');
    		$dels = array();
    		foreach($data as $v) {
          	if(!empty($v['table'])){
				$dels[$v['table']][] = $v['id'];	
	    		}	
    		}
    		foreach($dels as $k=>$v) {
			DB::query('DELETE FROM xercms_data_'.$k.' WHERE id in ('.implode(',',$v).')');
			DB::query('DELETE FROM xercms_comment_'.$k.' WHERE aid in ('.implode(',',$v).')');
    		}
    		DB::query('DELETE FROM xercms_archives WHERE id in('.$ids.')');
    		DB::query('DELETE FROM xercms_count WHERE id in ('.$ids.')');   
	}
  
    function shopUpdate($price,$number,$aid = 0,$mid = 0,$new = false) {
		if($new) {
			DB::insert('xercms_shop_archive',array('aid'=>$aid,'mid'=>$mid,'number'=>$number,'price'=>$price));
		} else DB::update('xercms_shop_archive',array('number'=>$number,'price'=>$price),array('aid'=>$aid,'mid'=>$mid));
	}
	
	function insert($base,$data) {
     	$base = $this->check($base,'base');  
		unset($base['id']);$base['ctime'] = $base['mtime'] = X::$G['time'];
		if(!$this->admin) {
	     	unset($base['flag']);
	 	}
	 
	 
	 	if(empty($base['title'])) {
	     	$this->error = '标题不能为空';return;
	 	}
	 	$base['model'] = $this->model['id'];
	 	$base = $this->safe($base,$this->struct);
	 	$base['uid'] = X::$G['uid'];
          if(isset($base['image']{5})) {
               $base['icon'] = 1;
          } else $base['icon'] = 0;  
	 	$id = DB::insert('xercms_archives',$base);
	 	$data = $this->check($data);

	 	$data = $this->encode($this->model['struct'],$data);

	 	$data = $this->safe($data,$this->model['struct']); 
	 	$data['id'] = $id;
	 
      	DB::insert('xercms_data_'.$this->model['table'],$data);
	 	DB::insert('xercms_count',array('id'=>$id));
		if(isset($this->model['category']) && $this->model['category'] == 1) {
			$shop = p('shop');
			$price  = isset($shop['price']) ? (int)$shop['price'] : 0;
			$number = isset($shop['number']) ? (int)$shop['number'] : 0;
			$this->shopUpdate($price,$number,$id,$this->model['id'],true);
		}
		return $id;
  	}
  
    	function safe($data,$struct) {
      	foreach($struct as $k=>$v) {
			if(isset($data[$k])) {
		        	if($v['type'] == 'int') {
			       	$data[$k] = (int)$data[$k];
                      	if($data[$k] < $v['range'][0]) {
                           	$data[$k] = $v['range'][0];
                     	} else if (isset($v['range'][1]) && $data[$k] > $v['range'][1]) {
                           	$data[$k] = $v['range'][1];
                      	}
			   	} else if ($v['type'] == 'float') {
			       	$data[$k] = (float)$data[$k];
                      	if($data[$k] < $v['range'][0]) {
                           	$data[$k] = $v['range'][0];
                      	} else if (isset($v['range'][1]) && $data[$k] > $v['range'][1]) {
                           	$data[$k] = $v['range'][1];
                      	}
			   	} else if ($v['type'] == 'html') {
                    	$max = isset($v['range'][1]) ? $v['range'][1] : $v['range'][0];
                    	if(strlen($data[$k]) > $max) {
                         	$data[$k] = mb_substr($data[$k],0,$max);
                    	}               
			     	$data[$k] = html($data[$k]);

			   	} else{
                    	$max = isset($v['range'][1]) ? $v['range'][1] : $v['range'][0];
                    	if(strlen($data[$k]) > $max) {
                         	$data[$k] = mb_substr($data[$k],0,$max);
                    	}     
			      	$data[$k] = htmlchars($data[$k]);
			   	}
			}
		}
		return $data;
	}
    
	function access($uid) {
        	if($this->admin) {
	       	return true;
	   	} else {
	       	if(empty(X::$G['uid'])  || $uid != X::$G['uid']) {
		     	return false;
		  	} else return true;
	   
	   	}
    	}
    
    	function update($id,$base,$data) {
		if(empty(X::$G['uid'])) {
			return false;
	 	}
	
      	$base = $this->check($base,'base');
      
	 	unset($base['id'],$base['model'],$base['ctime']);$base['ctime'] = $base['mtime'] = X::$G['time'];
	 	if(!$this->admin) {
	     	unset($base['flag']);
	 	}
	 
	 
	 	if(empty($base['title'])) {
	     	$this->error = '标题不能为空';return;
	 	}
	 	$base = $this->safe($base,$this->struct);
	 	$base = $this->contrast($id,$base);$base['mtime'] = X::$G['time'];
          if(isset($base['image']{5})) {
               $base['icon'] = 1;
          } else $base['icon'] = 0;  
	 	if(count($base)) {
	 		DB::update('xercms_archives',$base,array('id'=>$id));
	 	}
	 	$data = $this->check($data);
      	$data = $this->filter($data);
     	if($this->arcData == null) {
	   		$this->arcData = $this->select($id); 
		} 
	 	if(!$this->access($this->arcData['uid'])) {
	    		$this->error = '权限不够,无法操作。';return;
	 	} 
	 	$data = $this->encode($this->model['struct'],$data);

	 	$data = $this->safe($data,$this->model['struct']); 
	 	$data = $this->contrast($id,$data);
      	if(count($data)) {DB::update('xercms_data_'.$this->model['table'],$data,array('id'=>$id));}
		if(isset($this->model['category']) && $this->model['category'] == 1) {
			$shop = p('shop');
			$price  = isset($shop['price']) ? (int)$shop['price'] : 0;
			$number = isset($shop['number']) ? (int)$shop['number'] : 0;
			$this->shopUpdate($price,$number,$id,$this->model['id'],false);
		}
  	} 
  
	function filter($data) {
		foreach($this->model['struct'] as $k=>$v) {
		     if(!$v['editable']) {
			      unset($data[$k]);
			}
		}
		return $data;
	}
  
	function check($data,$table = '') {
      	$ndata = array();
     	switch($table) {
	     	case 'base':
		    		$ndata = array();
		    		foreach($this->struct as $k=>$v) {
		        		if(isset($data[$k])) {
			       		$ndata[$k] = $data[$k];
			   		}
		    		}
		    
			break;
	     	default:
		    		$ndata = array();	
      			foreach($this->model['struct'] as $k=>$v) {
		        		if(isset($data[$k])) {
			       		$ndata[$k] = $data[$k];
			   		} else {
			      		if($v['required']) {
				 			$ndata[$k] = $v['default'];
				 		}
			   		}
	  			}
			break;	
	 	}
	 	return $ndata;
  	}
  
	function contrast($id,$ndata) {
		foreach($ndata as $k=>$v) {
			if($v == $this->arcData[$k] ) {
				unset($ndata[$k]);
	  		}
		}
		return $ndata;
  	}
}
?>